/*
 * 所有类型，所想用 std::fmt 的格式化打印，都要求实现至少一个可打印的 traits。仅有一些
 * 类型提供了自动实现，比如std库中的类型。所有其他类型都必须手动实现。
 * fmt::Debug 这个trait 使这项工作变得简单。所有类型都能推导 fmt::Debug 的实现。
 * 但是fmt::Debug 需要手动实现。
 *
 * 所有 std 库类型都天生可以使用 {:?} 来打印
 */

// 推导 `Structure`的 `fmt::Debug` 实现
// `Structure`是一个包含单个`i32`的结构体
#[derive(Debug)]
struct Structure(i32);

// 将`Structure`放到结构体`Deep`中，然后使`Deep`也能够打印
#[derive(Debug)]
struct Deep(Structure);

#[derive(Debug)]
struct Person<'a> {
    name: &'a str,
    age: u8
}

fn main() {
    // 使用`{:?}`打印和使用 `{}`类似
    println!("{:?} months in a year.", 12);
    println!("{1:?} {0:?} is the {actor:?} name.",
            "Slater",
            "Christian",
            actor="actor's"
            );

    // `Structure`也可以打印
    println!("Now {:?} will print!", Structure(3));

    // 使用 `derive`的一个问题是不能控制输出的形式。
    println!("Now {:?} will print!", Deep(Structure(7)));

    // rust 通过 `{:#?}` 提供 美化打印的功能
    let name = "Peter";
    let age = 27;
    let peter = Person {name, age};
    println!("{:#?}", peter);
}